/////////////////////////////////////////////////////////////////////////////////////////////
// Filename: InputOwnedStates.h
// (c) Dave Ottley, 2012. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////
#ifndef INPUTOWNEDSTATES_H
#define INPUTOWNEDSTATES_H

#include "State.h"
class InputClass;
struct Telegram;

//////////////////////////////////////////////////////////////////////////////////////////////
//		- This is the normal input state that simply gathers and batch sends input to the
//		- application at predetermined intervals. This can be used for normal menu and
//		- gameplay purposes.
//////////////////////////////////////////////////////////////////////////////////////////////
class InputNormalState : public State<InputClass>
{
private:
	// Singleton
	InputNormalState() {}
	InputNormalState(const InputNormalState&);
	InputNormalState& operator=(const InputNormalState& rhs);

public:
	static InputNormalState * GetInstance();
	virtual void Enter(InputClass * inputSubsystem);
	virtual void Execute(InputClass * inputSubsystem);
	virtual void Exit(InputClass * inputSubsystem);
	virtual bool OnMessage(InputClass * inputSubsystem, const Telegram& msg);

};


//////////////////////////////////////////////////////////////////////////////////////////////
//		- No global input state determined at this time. Update as necessary
//////////////////////////////////////////////////////////////////////////////////////////////
class InputGlobalState : public State<InputClass>
{
private:
	// Singleton
	InputGlobalState() {}
	InputGlobalState(const InputGlobalState&);
	InputGlobalState& operator=(const InputGlobalState& rhs);

public:
	static InputGlobalState * GetInstance();
	virtual void Enter(InputClass * inputSubsystem);
	virtual void Execute(InputClass * inputSubsystem);
	virtual void Exit(InputClass * inputSubsystem);
	virtual bool OnMessage(InputClass * inputSubsystem, const Telegram& msg);

};


//////////////////////////////////////////////////////////////////////////////////////////////
//		- This state is to be used when non-stoppable cutscenes or animations are taking place
//		- and during level loading, etc.
//////////////////////////////////////////////////////////////////////////////////////////////
class InputFrozenState : public State<InputClass>
{
private:
	// Singleton
	InputFrozenState() {}
	InputFrozenState(const InputFrozenState&);
	InputFrozenState& operator=(const InputFrozenState& rhs);

public:
	static InputFrozenState * GetInstance();
	virtual void Enter(InputClass * inputSubsystem);
	virtual void Execute(InputClass * inputSubsystem);
	virtual void Exit(InputClass * inputSubsystem);
	virtual bool OnMessage(InputClass * inputSubsystem, const Telegram& msg);

};

#endif // INPUTOWNEDSTATES_H
